- 二维数组中的查找
- 二分查找
- 连续子数组的最大和
二维数组中的查找
问题
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
解法
矩阵是有序的,从左下角来看,向上数字递减,向右数字递增,因此从左下角开始查找。当要查找数字比左下角数字大时,右移;要查找数字比左下角数字小时,上移。
代码
|
|
二分查找
问题
对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。
给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
易错点
[4,4,8,10] 4 4 按常规二分查找返回的是1,本题应返回的是0
代码
|
|
连续最大和
问题
一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3
思路
动态规划。
如果用函数 f(i)表示以第 i 个数字结尾的子数组的最大和,那么我们需要求出 max[f(i)],其中 0 <= i < n。我们可用如下边归公式求 f(i):
这个公式的意义:当以第 i-1 个数字结尾的子数组中所有数字的和小于 0 时,如果把这个负数与第 i 个数累加,得到的结果比第 i 个数字本身还要小,所以这种情况下以第 i 个数字结尾的子数组就是第 i 个数字本身。如果以第 i-1 个数字结尾的子数组中所有数字的和大于 0,与第 i 个数字累加就得到以第 i 个数字结尾的子数组中所有数字的和。
易错点
很容易忽略全都是负数的情况,例如[-1,-2,-3,-4]。
代码
|
|